Go 的 常用命令
如果忘记哪个命令使用了可以使用 go help [command]
去看它的文档,这里就记录一些常用的命令
go build 编译命令
go build [-o output] [-i] [build flags] [packages]
它可以启动编译,把我们的包和相关的依赖编译成一个可执行的文件。
go build
go build .
go build hello.go
以上这三种写法,都是使用当前目录编译的意思。
因为我们忽略了 packages
,所以自然就使用当前目录进行编译了。从这里我们也可以推测出,go build
本质上需要的是一个路径,让编译器可以找到哪些需要编译的 go 文件。
packages 其实是一个相对路径,是相对于我们定义的 GOROOT 和 GOPATH 这两个环境变量的,所以有了 packages 这个参数后,go build
就可以知道哪些需要编译的 go 文件了。
go build example.org/tools
这种方式是指定包的方式,这样会明确的编译我们这个包。当然我们也可以使用通配符。
go build example.org/tools/...
3 个点表示匹配所有字符串,这样 go build
就会编译 tools 目录下的所有包。
go clean 清除命令
使用 go build
编译的时候,会产生编译生成的文件,使用这个命令它可以清理我们编译生成的文件,比如生成的可执行文件,生成 obj 对象等等。
go clean [-i] [-r] [-n] [-x] [build flags] [packages]
用法和 go build
基本一样
go run 编译运行
go build
是先编译,然后我们在执行可以执行文件来运行我们的程序,需要两步。go run
这个命令就是可以把这两步合成一步的命令,节省了我们录入的时间,通过 go run
命令,我们可以直接看到输出的结果。
在运行 go run
的时候,如果需要的话,我们可以给我们的程序传递参数,比如:
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("输入的参数为:",os.Args[1])
}
打开终端,输入如下命令执行:
go run main.go 12
go install 打包到库中
这个命令和 Maven 的 mvn install
是一样的
go install
命令在编译源代码之后还安装到指定的目录,即:go build
命令 + 把编译后的可执行文件放到 GOPATH/bin
目录下
它的用法和 go build
差不多,如果不指定一个包名,就使用当前目录。安装的目录都是约定好的,如果生成的是可执行文件,那么安装在 $GOPATH/bin
目录下;如果是可引用的库,那么安装在 $GOPATH/pkg
目录下。
go get 下载依赖
go get
命令,可以从网上下载更新指定的包以及依赖的包,并对它们进行编译和安装。
go get github.com/spf13/cobra
以上示例,我们就可以从 github
上直接下载这个 go 库到我们 GOPATH 工作空间中,以供我们使用。下载的是整个源代码工程,并且会根据它们编译和安装,和执行 go install
类似。
如果我们需要更新网络上的一个 go 工程,加 -u
标记即可。
go get -u github.com/spf13/cobra
go test 单元测试
该命令用于 Go 的单元测试,它也是接受一个包名作为参数,如果没有指定,使用当前目录。 go test
运行的单元测试必须符合 go 的测试要求。
- 写有单元测试的文件名,必须以
_test.go
结尾。 - 测试文件要包含若干个测试函数。
- 这些测试函数要以 Test 为前缀,还要接收一个
*testing.T
类型的参数。
package main
import "testing"
func TestAdd(t *testing.T) {
if Add(1,2) == 3 {
t.Log("1+2=3")
}
if Add(1,1) == 3 {
t.Error("1+1=3")
}
}
这是一个单元测试,保存在 main_test.go
文件中,对 main 包里的 Add(a,b int)
函数进行单元测试。 如果要运行这个单元测试,在该文件目录下,执行 go test
即可。
单元测试常用参数
这里介绍几个常用的参数:
-bench regexp
执行相应的 benchmarks,例如 -bench=.;
-cover
开启测试覆盖率;
-run regexp
只运行 regexp 匹配的函数,例如 -run=Array 那么就执行包含有 Array 开头的函数;
测试代码覆盖率方法
编写一个单元测试
func Test_StartMain(t *testing.T) {
main()
}
运行命令
go test -coverpkg="./..." -c -o cover.test
./cover.test -test.run "Test_StartMain" -test.coverprofile=cover.out
go tool cover -html cover.out -o cover.html
生成如下内容
这时可以点开这个 html
go mod 模块管理命令
go mod download
下载 go.mod 中的模块到本地缓存,缓存路径是$GOPATH/pkg/mod/cache
go mod edit
是提供了命令版编辑 go.mod 的功能,例如go mod edit -fmt go.mod
会格式化 go.modgo mod graph
把模块之间的依赖图显示出来go mod init
初始化模块(例如把原本 dep 管理的依赖关系转换过来),注意要在 init 后面加上项目名go mod tidy
增加缺失的包,移除没用的包go mod vendor
把依赖拷贝到 vendor/ 目录下go mod verify
确认依赖关系go mod why
解释为什么需要包和模块
显示依赖图可以直接使用 GoLand 提供的工具(就像 IDEA 那样的)
go generate 分析注释命令
这个命令是从 Go1.4 开始才设计的,通过分析源码中特殊的注释,然后执行相应的命令。
这个
go generate
是给你用的,不是给使用你这个包的人用的,是方便你来生成一些代码的。
如果我们想让 go generate
来触发命令,那么就可以在当前目录的任意一个 xxx.go 文件里面的任意位置增加一行如下的注释:
//go:generate go tool yacc -o gopher.go -p parser gopher.y
这里我们注意了,//go:generate
是没有任何空格的,这其实就是一个固定的格式,在扫描源码文件的时候就是根据这个来判断的。
使用时直接通过
go generate file.go